package com.java.thread;

/**
 * 线程中断方法interrupt
 * @author jack
 */

public class TestThreadInterrupt {
	
	/*知识点：
	1,interrupt()不会中断一个正在运行的线程,只会将中断状态置成true,但如果线程处于阻塞状态（比如Object.wait, Thread.join和Thread.sleep），此时线程没有占用CPU,
	调用它的interrput()方法不可能给自己的中断状态置位的,同时会抛出一个中断信号(InterruptedException)，要求退出阻塞的状态,重新回到可运行状态。

	2,interrupt()不能停止线程运行，但可以利用线程检查自己的中断状态(isInterrupted)来中断某一部分业务逻辑，线程在可运行状态时isInterrupted=false,
	调用interrupt()将中断状态置成true，唤醒线程后又变成false

	3,中止线程:Thread.stop()过期不安全。
	1)可以采用标志位使线程退出循环，run方法正常结束，如果线程在while循环中出现阻塞，线程就停在里面，标志位就起不到作用，这个时候就可以通过InterruptedException来唤醒线程，从而重新变为可运行状态，根据标志位退出循环。

	2)可以抛出异常:捕获到InterruptedException处理时再抛出一个异常throw new RuntimeException("抛出异常，终止线程",e);}
	3)return语句：catch() {} 中直接return即可安全地结束线程。


	4,I/O阻塞:阻塞的概念来自于进程，I/O阻塞可能是读取文件或者网络中断等等,比如调用read(),阻塞状态的线程是挂起的（挂起：暂时被淘汰出内存，不占有CPU）。

	*/
	public static void main(String[] args) {
		Thread thread=new Thread(){
			@Override
			public void run() {
				/*while(true){
					System.out.println("Thread is running...");
					long time = System.currentTimeMillis();//去系统时间的毫秒数
					while((System.currentTimeMillis()-time < 2000)) {   
						//程序循环2秒钟，不同于sleep(2000)会阻塞进程。     
					}
				}*/
				
				/*try{ 
					while(!Thread.currentThread().isInterrupted()){
						System.out.println("Thread is running...");
						//while循环有一个决定因素就是需要不停的检查自己的中断状态。当外部线程调用该线程的interrupt时，使得中断状态置位。这是该线程将终止循环，不在执行循环中的do more work
						// do more work;  
						Thread.sleep(500);
					}
				
				}catch(InterruptedException e){  
					// thread was interrupted during sleep or wait 
				}finally{ 
					 // cleanup, if required  
				}*/
				
				while(true){
					try{
						System.out.println("Thread is running...");
						Thread.sleep(10000); //这个线程将被阻塞10秒   
					}catch(InterruptedException e){
						// thread was interrupted during sleep or wait
						e.printStackTrace();
						System.out.println("isInterrupted=="+Thread.currentThread().isInterrupted());
					}
				}

			}
			
		};
		thread.start();
		
		
		System.out.println("isInterrupted=="+thread.isInterrupted());
		thread.interrupt();
		System.out.println("isInterrupted=="+thread.isInterrupted());
	}
	

}
